home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (C) 1986-2001 by Digital Mars. $Revision: 1.1.1.1 $ */
- #if __SC__ || __RCC__
- #pragma once
- #endif
-
- #ifndef __ELF_H
- #define __ELF_H 1
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- #pragma pack(1)
-
- typedef unsigned long Elf32_Addr;
- typedef unsigned short Elf32_Half;
- typedef unsigned long Elf32_Off;
- typedef long Elf32_Sword;
- typedef unsigned long Elf32_Word;
-
- #define ELF32_FSZ_ADDR 4
- #define ELF32_FSZ_HALF 2
- #define ELF32_FSZ_OFF 4
- #define ELF32_FSZ_SWORD 4
- #define ELF32_FSZ_WORD 4
-
- /* ELF header */
-
- #define EI_NIDENT 16
-
- typedef struct {
- unsigned char e_ident[EI_NIDENT]; /* ident bytes */
- Elf32_Half e_type; /* file type */
- Elf32_Half e_machine; /* target machine */
- Elf32_Word e_version; /* file version */
- Elf32_Addr e_entry; /* start address */
- Elf32_Off e_phoff; /* phdr file offset */
- Elf32_Off e_shoff; /* shdr file offset */
- Elf32_Word e_flags; /* file flags */
- Elf32_Half e_ehsize; /* sizeof ehdr */
- Elf32_Half e_phentsize; /* sizeof phdr */
- Elf32_Half e_phnum; /* number phdrs */
- Elf32_Half e_shentsize; /* sizeof shdr */
- Elf32_Half e_shnum; /* number shdrs */
- Elf32_Half e_shstrndx; /* shdr string index */
- } Elf32_Ehdr;
-
- #define EI_MAG0 0 /* e_ident[] indexes */
- #define EI_MAG1 1
- #define EI_MAG2 2
- #define EI_MAG3 3
- #define EI_CLASS 4
- #define EI_DATA 5
- #define EI_VERSION 6
- #define EI_PAD 7
-
- #define ELFMAG0 0x7f /* EI_MAG */
- #define ELFMAG1 'E'
- #define ELFMAG2 'L'
- #define ELFMAG3 'F'
- #define ELFMAG "\177ELF"
- #define SELFMAG 4
-
- // Where x = e_ident
-
- #define ISELF(x) (((x[EI_MAG0])==ELFMAG0) && \
- ((x[EI_MAG1])==ELFMAG1) && \
- ((x[EI_MAG2])==ELFMAG2) && \
- ((x[EI_MAG3])==ELFMAG3))
-
- #define ELFCLASSNONE 0 /* EI_CLASS */
- #define ELFCLASS32 1
- #define ELFCLASS64 2
- #define ELFCLASSNUM 3
-
- #define ELFDATANONE 0 /* EI_DATA */
- #define ELFDATA2LSB 1
- #define ELFDATA2MSB 2
- #define ELFDATANUM 3
-
- #define ET_NONE 0 /* e_type */
- #define ET_REL 1
- #define ET_EXEC 2
- #define ET_DYN 3
- #define ET_CORE 4
- #define ET_NUM 5
-
- #define ET_LOPROC 0xff00 /* processor specific range */
- #define ET_HIPROC 0xffff
-
- #define EM_NONE 0 /* e_machine */
- #define EM_M32 1 /* AT&T WE 32100 */
- #define EM_SPARC 2 /* Sun SPARC */
- #define EM_386 3 /* Intel 80386 */
- #define EM_68K 4 /* Motorola 68000 */
- #define EM_88K 5 /* Motorola 88000 */
- #define EM_486 6 /* Intel 80486 */
- #define EM_860 7 /* Intel i860 */
- #define EM_NUM 8
-
- #define EV_NONE 0 /* e_version, EI_VERSION */
- #define EV_CURRENT 1
- #define EV_NUM 2
-
- /* Program header */
-
- typedef struct {
- Elf32_Word p_type; /* entry type */
- Elf32_Off p_offset; /* file offset */
- Elf32_Addr p_vaddr; /* virtual address */
- Elf32_Addr p_paddr; /* physical address */
- Elf32_Word p_filesz; /* file size */
- Elf32_Word p_memsz; /* memory size */
- Elf32_Word p_flags; /* entry flags */
- Elf32_Word p_align; /* memory/file alignment */
- } Elf32_Phdr;
-
- #define PT_NULL 0 /* p_type */
- #define PT_LOAD 1
- #define PT_DYNAMIC 2
- #define PT_INTERP 3
- #define PT_NOTE 4
- #define PT_SHLIB 5
- #define PT_PHDR 6
- #define PT_NUM 7
-
- #define PT_LOPROC 0x70000000 /* processor specific range */
- #define PT_HIPROC 0x7fffffff
-
- #define PF_R 0x4 /* p_flags */
- #define PF_W 0x2
- #define PF_X 0x1
-
- #define PF_MASKPROC 0xf0000000 /* processor specific values */
-
- /* Section header */
-
- typedef struct {
- Elf32_Word sh_name; /* section name */
- Elf32_Word sh_type; /* SHT_... */
- Elf32_Word sh_flags; /* SHF_... */
- Elf32_Addr sh_addr; /* virtual address */
- Elf32_Off sh_offset; /* file offset */
- Elf32_Word sh_size; /* section size */
- Elf32_Word sh_link; /* misc info */
- Elf32_Word sh_info; /* misc info */
- Elf32_Word sh_addralign; /* memory alignment */
- Elf32_Word sh_entsize; /* entry size if table */
- } Elf32_Shdr;
-
- #define SHT_NULL 0 /* sh_type */
- #define SHT_PROGBITS 1
- #define SHT_SYMTAB 2
- #define SHT_STRTAB 3
- #define SHT_RELA 4
- #define SHT_HASH 5
- #define SHT_DYNAMIC 6
- #define SHT_NOTE 7
- #define SHT_NOBITS 8
- #define SHT_REL 9
- #define SHT_SHLIB 10
- #define SHT_DYNSYM 11
- #define SHT_NUM 12
- #define SHT_LOUSER 0x80000000
- #define SHT_HIUSER 0xffffffff
-
- #define SHT_LOPROC 0x70000000 /* processor specific range */
- #define SHT_HIPROC 0x7fffffff
-
- #define SHF_WRITE 0x1 /* sh_flags */
- #define SHF_ALLOC 0x2
- #define SHF_EXECINSTR 0x4
-
- #define SHF_MASKPROC 0xf0000000 /* processor specific values */
-
- #define SHN_UNDEF 0 /* special section numbers */
- #define SHN_TEXT 1
- #define SHN_DATA 2
- #define SHN_BSS 3
- #define SHN_COMMENT 4
- #define SHN_DEBUG 5
- #define SHN_LINE 6
- #define SHN_DATAXI 7
- #define SHN_DATAXC 8
- #define SHN_REL_TEXT 9
- #define SHN_REL_DATA 10
- #define SHN_SYMTAB 11
- #define SHN_STRTAB 12
- #define SHN_REL_DEBUG 13
- #define SHN_REL_LINE 14
- #define SHN_REL_DATAXI 15
- #define SHN_REL_DATAXC 16
- #define MAX_SCNS 17
- #define SHN_REL SHN_DATAXC
- #define SHN_LORESERVE 0xff00
- #define SHN_ABS 0xfff1
- #define SHN_COMMON 0xfff2
- #define SHN_HIRESERVE 0xffff
-
- #define SHN_LOPROC 0xff00 /* processor specific range */
- #define SHN_HIPROC 0xff1f
-
- /* Symbol table */
-
- typedef struct {
- Elf32_Word st_name;
- Elf32_Addr st_value;
- Elf32_Word st_size;
- unsigned char st_info; /* bind, type: ELF_32_ST_... */
- unsigned char st_other;
- Elf32_Half st_shndx; /* SHN_... */
- } Elf32_Sym;
-
- #define STN_UNDEF 0
-
- /* The macros compose and decompose values for S.st_info
- *
- * bind = ELF32_ST_BIND(S.st_info)
- * type = ELF32_ST_TYPE(S.st_info)
- * S.st_info = ELF32_ST_INFO(bind, type)
- */
-
- #define ELF32_ST_BIND(info) ((info) >> 4)
- #define ELF32_ST_TYPE(info) ((info) & 0xf)
- #define ELF32_ST_INFO(bind, type) (((bind)<<4)+((type)&0xf))
-
- #define STB_LOCAL 0 /* BIND */
- #define STB_GLOBAL 1
- #define STB_WEAK 2
- #define STB_NUM 3
-
- #define STB_LOPROC 13 /* processor specific range */
- #define STB_HIPROC 15
-
- #define STT_NOTYPE 0 /* TYPE */
- #define STT_OBJECT 1
- #define STT_FUNC 2
- #define STT_SECTION 3
- #define STT_FILE 4
- #define STT_NUM 5
-
- #define STT_LOPROC 13 /* processor specific range */
- #define STT_HIPROC 15
-
-
- /* Relocation */
-
- typedef struct {
- Elf32_Addr r_offset;
- Elf32_Word r_info; /* sym, type: ELF32_R_... */
- } Elf32_Rel;
-
- typedef struct {
- Elf32_Addr r_offset;
- Elf32_Word r_info; /* sym, type: ELF32_R_... */
- Elf32_Sword r_addend;
- } Elf32_Rela;
-
- /* The macros compose and decompose values for Rel.r_info, Rela.f_info
- *
- * sym = ELF32_R_SYM(R.r_info)
- * type = ELF32_R_TYPE(R.r_info)
- * R.r_info = ELF32_R_INFO(sym, type)
- */
-
- #define ELF32_R_SYM(info) ((info)>>8)
- #define ELF32_R_TYPE(info) ((unsigned char)(info))
- #define ELF32_R_INFO(sym, type) (((sym)<<8)+(unsigned char)(type))
-
-
- /* Note entry header */
-
- typedef struct {
- Elf32_Word n_namesz; /* length of note's name */
- Elf32_Word n_descsz; /* length of note's "desc" */
- Elf32_Word n_type; /* type of note */
- } Elf32_Nhdr;
-
- /* Known values for note entry types (e_type == ET_CORE) */
-
- #define NT_PRSTATUS 1
- #define NT_PRFPREG 2
- #define NT_PRPSINFO 3
-
-
- #define R_386_NONE 0 /* relocation type */
- #define R_386_32 1
- #define R_386_PC32 2
- #define R_386_GOT32 3
- #define R_386_PLT32 4
- #define R_386_COPY 5
- #define R_386_GLOB_DAT 6
- #define R_386_JMP_SLOT 7
- #define R_386_RELATIVE 8
- #define R_386_GOTOFF 9
- #define R_386_GOTPC 10
- #define R_386_NUM 11
-
- #define ELF_386_MAXPGSZ 0x1000 /* maximum page size */
-
- struct elf_section
- {
- Elf32_Shdr *shdr;
- unsigned char *data;
- };
-
- union elf_relocation
- {
- Elf32_Rel rel;
- Elf32_Rela rela;
- };
-
- #define SOURCE_NO_POS 0xffff
-
- struct elf_lineno
- {
- Elf32_Word linenum;
- Elf32_Half lineposn; // = SOURCE_NO_POS for whole line
- Elf32_Word offset;
- };
-
- #pragma pack()
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
-